package persi.reporte;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.transform.BasicTransformerAdapter;

import persi.futbol.Equipo;
import persi.futbol.partidos.PartidoCopa;
import persi.hibernate.Home;

public class ReporteMayorGanadorDeCopa extends AbstractReporter<PartidoCopa> {
	public class MiReporterPrinter extends AbstractReporter.ReporterPrinter {

		public MiReporterPrinter(Equipo equipo, Long cantidad) {
			super(equipo, cantidad);
		}

		@Override
		public String toString() {
			return "El equipo " + this.getEquipo().getNombre() + " gano "
					+ this.getCantidadGanados() + " partidos";
		}
	}

	public ReporteMayorGanadorDeCopa() {
		super(new Home<PartidoCopa>(PartidoCopa.class));
	}

	@Override
	protected Criteria construirCriterio() {
		final Criteria filtro = this.getHome().crearCriterio();
		final ProjectionList proyecciones = Projections.projectionList();
		proyecciones.add(Projections.count("ganador"), "ganados");
		proyecciones.add(Projections.groupProperty("ganador"));
		filtro.setProjection(proyecciones);
		filtro.addOrder(Order.desc("ganados"));
		filtro.setResultTransformer(new BasicTransformerAdapter() {
			private static final long serialVersionUID = -8897484248743131027L;

			@Override
			public Object transformTuple(Object[] tuple, String[] aliases) {
				return new ReporteMayorGanadorDeCopa.MiReporterPrinter(
						(Equipo) tuple[1], (Long) tuple[0]);
			}
		});
		return filtro;
	}

}
